#pragma once
#include "Common.hpp"
using namespace ns_log;
// 在线用户管理类
class OnlineManager
{
private:
    // 游戏大厅用户 : 通信连接
    std::unordered_map<LL, WebSocketServer::connection_ptr> _hall_ctl;
    // 游戏房间中的用户id: 通信连接
    std::unordered_map<LL, WebSocketServer::connection_ptr> _room_ctl;
    std::mutex _mtx;

public:
    OnlineManager()
    {
    }
    ~OnlineManager()
    {
    }
    // 加入大厅/房间
    void OnlineToHail(LL id, WebSocketServer::connection_ptr &conn)
    {
        // 先判断是否存在该用户
        {
            std::unique_lock<std::mutex> lock(_mtx);
            if (!IsExistsInHail(id))
            {
                // 上线
                _hall_ctl.insert(std::make_pair(id, conn));
                LOG(DEBUG, "id = %lld 的用户已进入游戏大厅\n", id);
            }
        }
    }
    void OnlineUserToRoom(LL id, WebSocketServer::connection_ptr &conn)
    {
        {
            std::unique_lock<std::mutex> lock(_mtx);
            if (!IsExistsInRoom(id))
            {
                _room_ctl.insert(std::make_pair(id, conn));
                LOG(DEBUG, "id = %lld 的用户已进入房间\n", id);
            }
        }
    }
    // 离开大厅
    void OfflineUserToHail(LL id)
    {
        {
            std::unique_lock<std::mutex> lock(_mtx);
            if (IsExistsInHail(id))
            {
                // 存在才能离线
                _hall_ctl.erase(id);
                LOG(DEBUG, "id = %lld 的用户已离开大厅\n", id);
            }
        }
    }
    // 离开房间
    void OfflineUserToRoom(LL id)
    {
        {
            std::unique_lock<std::mutex> lock(_mtx);
            if (IsExistsInRoom(id))
            {
                // 存在才能离线
                _room_ctl.erase(id);
                LOG(DEBUG, "id = %lld 的用户已离开房间\n", id);
            }
        }
    }
    // 是否存在
    bool IsExistsInHail(LL id)
    {
        auto iter = _hall_ctl.find(id);
        if (iter == _hall_ctl.end())
        {
            return false;
        }
        return true;
    }
    bool IsExistsInRoom(LL id)
    {
        auto iter = _room_ctl.find(id);
        if (iter == _room_ctl.end())
        {
            return false;
        }
        return true;
    }
    // 根据id找到对应连接
    WebSocketServer::connection_ptr GetConnByHail(LL id)
    {
        std::unique_lock<std::mutex> lock(_mtx);
        auto iter = _hall_ctl.find(id);
        if (iter == _hall_ctl.end())
        {
            // 没找到返回空
            return WebSocketServer::connection_ptr();
        }
        return iter->second;
    }
    WebSocketServer::connection_ptr GetConnByRoom(LL id)
    {
        std::unique_lock<std::mutex> lock(_mtx);
        auto iter = _room_ctl.find(id);
        if (iter == _room_ctl.end())
        {
            return WebSocketServer::connection_ptr();
        }
        return iter->second;
    }
};